const path = require('path')

const Koa = require('koa')
const KoaBody = require('koa-body')
const KoaStatic = require('koa-static')
const parameter = require('koa-parameter')
const cors = require('koa2-cors')
const compress = require('koa-compress')

const router = require('../router')

const errHandler = require('./errerHandler')

const app = new Koa()

app.use(cors())

app.use(compress({ threshold: 2048 }))

// 在所有中间件之前注册koa-body
app.use(
  KoaBody({
    multipart: true,
    formidable: {
      // 不推荐使用相对路径如（./src/uploads），相对的是 process.cwd() ，当前脚本所执行的路径
      uploadDir: path.join(__dirname, '../uploads'),
      keepExtensions: true,
    },
    parsedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
  })
)

app.use(KoaStatic(path.join(__dirname, '../uploads')))
app.use(KoaStatic(path.join(__dirname, '../public')))

// 在路由注册之前使用，在ctx上注册了verifyParams方法
app.use(parameter(app))

app.use(router.routes())
// 没实现的http方法返回501
app.use(router.allowedMethods())

// 统一的错误处理，监听自定义error事件，交由错误处理函数统一处理
app.on('error', errHandler)

module.exports = app
